package awt;

import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class CAPTCHA {
    public static void getImage() {
        Frame frame = new Frame();
        frame.setTitle("图片验证码框架");
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                // 关闭此窗口并释放被占用的内存
                ((Frame) e.getSource()).dispose();
                // 关闭最后一个可显示的窗口后，虚拟机可能会自动终止
            }
        });
        // 设置可见性
        frame.setVisible(true);
        frame.setSize(600, 400);
        frame.setLocationRelativeTo(null);
        Panel panel = (Panel) frame.add(new Panel());
        int width = 100;
        int height = 32;
        // 以给定的宽度，高度和缓存图像类型构建一个缓存图像实例
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // 以给定的图像构建一个图像图标
        ImageIcon icon = new ImageIcon(image);
//        panel.prepareImage(image, panel);
        JLabel label = new JLabel(icon);
        panel.add(label);
        // 构造当前缓存图像的平面图形上下文（在旧版本中建议调用getGraphics方法）
        Graphics graphics = image.createGraphics();
        // 令此图形上下文的所有后续图形操作均使用此指定颜色，直到下次调用此方法时
        graphics.setColor(new Color(0xDCDCDC));
        // 填充具有给定的横纵坐标，宽，高度的矩形
        graphics.fillRect(0, 0, width, height);
        graphics.setColor(Color.BLACK);
        // 绘制指定矩形的轮廓
        graphics.drawRect(0, 0, width - 1, height - 1);
        // 构建用于生成验证码的Random实例
        Random random = new Random();
        // 返回整数参数的字符串表示
        String hash = Integer.toHexString(random.nextInt(Integer.MAX_VALUE));
        for (int i = 0; i < 128; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            // 绘制一个具有给定的横纵坐标，宽，高度的椭圆
            // 当椭圆的宽与高均为0,被视为一个点
            graphics.drawOval(x, y, 0, 0);
        }
        // 生成一个字符串hash的子串，从hash最左侧开始，到下标为6的字符之前
        String code = hash.substring(0, 6);
        graphics.setColor(new Color(0, 100, 0));
        // 设置图形上下文的字体
        graphics.setFont(new Font("Cantarell", Font.BOLD, 24));
        // 使用此图形上下文的当前字体和颜色，绘制指定字符串给出的文本
        graphics.drawString(code, 8, 24);
        // 处置此图形上下文并释放其使用的任何系统资源
        graphics.dispose();
    }
}
